//把每种获取 upload 对象的方法都封装在各自的函数里，然后使用一个迭代器，
//迭代获取这些 upload 对象，直到获取到一个可用的为止
var getActiveUploadObj  =  function(){
    try{
        return new ActiveXObject( "TXFTNActiveX.FTNUpload" ); // IE 上传控件
    }catch(e){
        return false
    }
}

var getFlashUploadObj = function(){
    if ( supportFlash() )
    { // supportFlash 函数未提供
        var str = '<object type="application/x-shockwave-flash"></object>'; 
        return $( str ).appendTo( $('body') ); 
    } 
        return false;
}

var getFormUpladObj = function(){ 
    var str = '<input name="file" type="file" class="ui-file"/>'; // 表单上传
    return $( str ).appendTo( $('body') ); 
}; 

// 提供一个可以被迭代的方法，使得 getActiveUploadObj，getFlashUploadObj 以及 getFlashUploadObj
// 依照优先级被循环迭代。
// 如果正在被迭代的函数返回一个对象，则表示找到了正确的 upload 对象，
// 反之如果该函数返回 false，则让迭代器继续工作。
var iteratorUploadObj = function(){
    for(var i = 0 , fn;fn = arguments[i++];){
        var uploadObj = fn(); 
        if(uploadObj !== false){
            return uploadObj;
        }
    }
}